#include "thttpd.h"
#include <modbus.h>
stat_t p;
void *pthread(void *arg)
{   int a,b,c,d=1;
    modbus_t *ctx = (modbus_t *)arg;
    uint16_t dest[32] = {};
    while (1)
    {
        modbus_read_registers(ctx, 0, 4, dest);
        // printf("光线传感器:%d,加速度传感器X:%d,加速度传感器Y:%d,加速度传感器Z:%d\n", dest[0], dest[1], dest[2], dest[3]);
        // p->registers = dest[0];
        // p->speedX = dest[1];
        // p->speedY = dest[2];
        // p->speedZ = dest[3];
        printf("光线传感器:%d,加速度传感器X:%d,加速度传感器Y:%d,加速度传感器Z:%d\n", a, b, c, d);
        p->registers = a;
        p->speedX = b;
        p->speedY = c;
        p->speedZ = d;
        a++;b++;c++;d++;
        sleep(3);
       }
}
int main(int argc, char const *argv[])
{
    // 创建实例(modbus_new_tcp返回一个实例)
    modbus_t *ctx = modbus_new_tcp("192.168.31.159", 502);
    if (ctx == NULL)
    {
        perror("modbus_new_tcp err");
        return -1;
    }
    // 设置从机id
    modbus_set_slave(ctx, 1);
    // 建立连接
    modbus_connect(ctx);

    // 创建并打开共享内存
    printf("open share\n");
    key_t key = ftok("./main.c", 'a');
    if (key < 0)
    {
        perror("ftok err");
        return -1;
    }
    printf("%#x\n", key);
    int shmid = shmget(key, 256, IPC_CREAT | IPC_EXCL | 0666);
    if (shmid < 0)
    {
        if (errno == EEXIST)
        {
            // 打开共享内存
            shmid = shmget(key, 256, 0666);
        }
        else
        {
            perror("shmid create err");
            return -1;
        }
    }
    // 建立映射关系
    p = shmat(shmid, NULL, 0);
    if (p == (stat_t)-1)
    {
        perror("shmat err");
        return -1;
    }

    // 创建一个线程
    pthread_t tid;
    // 采集
    if (pthread_create(&tid, NULL, pthread, (void *)ctx))
    {
        printf("pthread_create err\n");
        return -1;
    }
    // 创建消息队列
    // key_t key2 = ftok("./main.c", 'a');
    int msgid = msgget(key,IPC_CREAT|IPC_EXCL|0666);
    if (msgid < 0)
    {
        if (errno == EEXIST)
        {
            msgid = msgget(key,0666);
        }
        else
        {
            perror("msgget err");
            return -1;
        }
    }
    char buf[64] = {};
    while (1)
    {   
        msgrcv(msgid,buf,sizeof(buf),0,0);  
        printf("%s\n",buf);
        sscanf(buf,"colinum=%dcolistat=%d",&p->coil,&p->state);//sscanf 读buf,p->coil存的线圈地址,p->state:线圈状态
        modbus_write_bit(ctx,p->coil,p->state);//写入单个线圈状态
    }
    pthread_join(tid, NULL); // 阻塞
    // 关闭套接字
    modbus_close(ctx);
    // 释放实例
    modbus_free(ctx);
    return 0;
}
